home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Information
/
CSMP Digest
/
volume 3
/
csmp-digest-v3-041
< prev
next >
Wrap
Text File
|
1995-12-31
|
67KB
|
1,820 lines
Received-Date: Sat, 2 Jul 1994 17:46:55 +0200
From: pottier@clipper.ens.fr (Francois Pottier)
Subject: csmp-digest-v3-041
To: csmp-digest@ens.fr
Date: Sat, 2 Jul 1994 17:46:50 +0200 (MET DST)
X-Mailer: ELM [version 2.4 PL23]
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
Errors-To: listman@ens.fr
Reply-To: pottier@clipper.ens.fr
X-Sequence: 44
C.S.M.P. Digest Sat, 02 Jul 94 Volume 3 : Issue 41
Today's Topics:
Detecting pre-68020 CPU for 68020 code
Fast Animations (WAS: Fast full screen scrolling: impossible?)
FlattenMovieData bug???
Here's how to get OpenDoc
How to know the cursor is into a polygon?
PowerPC load-store (was Re: Fast full screen scrolling: impossible?)
Q: Default button & Return key in Modeless Dialog
Questions about Tmon?
Saving PICT files - Here's CODE!!
Scroll Bars in DLOG?
Why should't you move baseAddrs?
cntl-opt-esc
scroll bars in modal dialogs
The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
(pottier@clipper.ens.fr).
The digest is a collection of article threads from the internet newsgroup
comp.sys.mac.programmer. It is designed for people who read c.s.m.p. semi-
regularly and want an archive of the discussions. If you don't know what a
newsgroup is, you probably don't have access to it. Ask your systems
administrator(s) for details. If you don't have access to news, you may
still be able to post messages to the group by using a mail server like
anon.penet.fi (mail help@anon.penet.fi for more information).
Each issue of the digest contains one or more sets of articles (called
threads), with each set corresponding to a 'discussion' of a particular
subject. The articles are not edited; all articles included in this digest
are in their original posted form (as received by our news server at
nef.ens.fr). Article threads are not added to the digest until the last
article added to the thread is at least two weeks old (this is to ensure that
the thread is dead before adding it to the digest). Article threads that
consist of only one message are generally not included in the digest.
The digest is officially distributed by two means, by email and ftp.
If you want to receive the digest by mail, send email to listserv@ens.fr
with no subject and one of the following commands as body:
help Sends you a summary of commands
subscribe csmp-digest Your Name Adds you to the mailing list
signoff csmp-digest Removes you from the list
Once you have subscribed, you will automatically receive each new
issue as it is created.
The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
Questions related to the ftp site should be directed to
scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
digest are available there.
Also, the digests are available to WAIS users. To search back issues
with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
-------------------------------------------------------
>From nagle@netcom.com (John Nagle)
Subject: Detecting pre-68020 CPU for 68020 code
Date: Thu, 16 Jun 1994 16:44:14 GMT
Organization: NETCOM On-line Communication Services (408 261-4700 guest)
Now that Symantec C++ is finally generating 68020 code when asked to
do so (for years, that switch did nothing), it's worth nothing that this
creates a problem in C++.
In C programs, even Think C type programs, the first code executed
is in "main", so it's sufficient to check CPU type there. But in C++,
static constructors run before "main". Now that TCL is starting to use
constructors, and constructors are starting to work right in SC++, it's
more likely that code with a 68020 instruction might be executed before
"main".
It's hard to deal with this in a way that's guaranteed to work
from the user program. The check for 68020 needs to be made in
"CODE 1", the startup code block cranked out by the compiler for every
C++ program. The user can't do this; only Symantec can.
Anybody still care about pre-68020 machines, anyway?
John Nagle
+++++++++++++++++++++++++++
>From jwbaxter@olympus.net (John W. Baxter)
Date: Thu, 16 Jun 1994 19:10:32 -0700
Organization: Internet for the Olympic Peninsula
In article <nagleCrI15q.Kru@netcom.com>, nagle@netcom.com (John Nagle)
wrote:
>
> Anybody still care about pre-68020 machines, anyway?
I don't, and I have two of them (a Plus, and a first 100-days Mac now in
512KE form).
However, there still are some Mac Portable owners around who do. By now,
they must be used to programs which claim to require a 68020 or better
crashing on their machine, but it certainly isn't a nice thing to do to
them.
Do the constructors for the static objects actually *use* any 68020
instructions on a regular basis? [Gestalt is available if you really want
to check in each such constructor...or in a phoney or real object you
arrange to have constructed first.]
--
John Baxter Port Ludlow, WA, USA [West shore, Puget Sound]
No hablo Intel.
jwbaxter@pt.olympus.net
+++++++++++++++++++++++++++
>From nagle@netcom.com (John Nagle)
Date: Fri, 17 Jun 1994 15:39:19 GMT
Organization: NETCOM On-line Communication Services (408 261-4700 guest)
jwbaxter@olympus.net (John W. Baxter) writes:
>Do the constructors for the static objects actually *use* any 68020
>instructions on a regular basis? [Gestalt is available if you really want
>to check in each such constructor...or in a phoney or real object you
>arrange to have constructed first.]
If you do any subscript calculations involving 2D arrays or arrays
of structures, you'll probably use the 32-bit multiply on a 68020.
On 68000 machines, a subroutine is called for every 32-bit multiply.
You can't have an object you "arrange to have constructed first".
It's a feature of C++ that order of static constructor execution is
random across file boundaries. ARM 12.6.1.
You can't even call Gestalt from the constructor usefully unless
your class is a base class. Base class constructors get called first,
so if your class is derived from another class, its constructor will be
called only after the base class constructor has already run. It
won't help to override functions in the base class, either; the base class
versions will be called when the base class constructor is called.
So there really isn't a sound way to do this.
John Nagle
John Nagle
---------------------------
>From cfranz@home.malg.imp.com (Christian Franz)
Subject: Fast Animations (WAS: Fast full screen scrolling: impossible?)
Date: Thu, 16 Jun 1994 09:14:27 GMT
Organization: Union Bank of Switzerland, CH
In article <1994Jun13.212936.24879@dal1>, seanmcd@ac.dal.ca wrote:
>
> In article <CrCFxp.79K@park.uvsc.edu>, stay@park.uvsc.edu (Steve Taylor) writes:
> > From article <1994Jun12.232257.24853@dal1>, by seanmcd@ac.dal.ca:
> >> I think Chuck Yeager's Air Combat does this too. You can see interlacing
> >> in the terrain if you rock the plane back and forth.
> >>
> >> Sean
> >
> > Could someone describe this technique in more detail? Are you talking
> > about leaving the other lines there and blitting the other half or
> > are you talking about doubling the height of the lines or what?
> > Thanks.
> >
> Well the description given above makes AstroChase 3D sound like CYAC,
> although the only thing I've seen in AstroChase 3D is the venetian blind
> style, rendering the frame onto every other line. Deliverance also has the
> option to do this, as does a game called Gate. It looks to me like CYAC
> does interlacing, i.e., there are no black lines alternating with the
> graphics, but if you rock the plane
> or turn rapidly, you can see the interlacing effect fairly easy in large
> polygons.
I'm currently developing a 3D space game and of course, I have the same
problems. I have tried many things, among them the alternate line modes
used by Astrochase (draw every other line) and CYAC (draw even lines on
even frames, odd lines on odd frames).
All these algorithms make one main assumption:
You draw the image in an off-screen buffer and after you are done drawing
it, you blast the image to screen. It usually takes three steps:
1. erase offscreen buffer
2. draw new frame offscreen
3. blast offscreen image on-screen.
Tuning step 3 can speed up your program, but usually only by 1/6 max
(optimized blitting is usually one third of the time per frame and I
assume you double the speed of blitting by halving the lines to copy).
I have found out that there is a much better method (however, I doubt
if this technique can be applied to moving backgrounds as is the
main title of this thread). Actually I didn't find out myself but
Juri Munkki, Mac Animations Guru DeLuxe, did. Since my program uses
polygon-oriented graphics, you collect all your polygons as if you
would draw them. Then you compare them with all polygons drawn in
the last frame and output *the*difference* to screen. This eliminates
the need to erase your offscreen map and since two successive frames
are usually similar to each other, you just draw a fraction of what
you usually do. Although the overhead for collecting the polygons
is probably a bit more than drawing them, the subsequent elimination
of 90% that needs to be redrawn makes up for this. Also, if you just
output the difference, this eliminates the need to as this is included
into the algorithm.
Mhhh. On second thought, this doesn't work at all for a scrolling
background... But then, neither CYAC nor AC3D have moving background.
> I don't know enough about 3D graphics to know whether you could
> actually render even/odd scanlines or whether he's just splitting an
> off-screen drawing into two blits.
Well, I have some experience with 3D graphics and there are to
fundamental different approaches. On is called object-space, the
other scan-space (well, at least in german. They seem to translate
badly). In object space you calculate all surfaces of the objects
and project them on your (off)screen using normal projection methods.
To tune your animation you use object coherencies (you take
advantage of the fact that an object doesn't change much between
two frames). In this algorithm you can't render only for odd lines.
You have to render the whole scene and then transfer every other
line.
In scan space you take the inverted approach. For each pixel you
decide which surface is frontmost and set this pixel to the
appropriate color/texture. To tune this algorithm you can use
scan-line coherencies (the fact that two pixels in any direction
usually don't change much in color, both in x and y direction).
With scan-space, you *can* render every other line directly.
The third possibility is a combination of both methods. It's what
Juri's program does (as I suspect. I havn't seen a single line of
his code, but the performance of the demos he sent me leave no
other explanation). You use object space to pre-calculate all
objects (i.e. all vertices that define your surfaces), collect
them to polygons that are not drawn but *mathematically* compared
to the last frame, collect the difference to other polygons and
finally draw the new polygons (using scan coherencies). You
can draw directly to screen since you change so few things that
it seems instantaneous. Juri claims that his algorithm is a
bit faster than the one used in FA-18 (I think they use
a similar approach) and quite frankly, I believe every word
of it.
>
> Sean
OK, sorry to have held you up with this rather lengthy discussion
of some arcane and irrelevant topic, but I have spent a lot of
time investigating this and maybe someone can make some use out
of it. Have a nice day.
Cheers,
Christian
- -
Christian Franz * Union Bank of Switzerland, CH
cfranz@home.malg.imp.com <- at home -> +41-1-261 26 96
---------------------------
>From Frank Manshande <frankm@and.nl>
Subject: FlattenMovieData bug???
Date: Mon, 13 Jun 1994 14:47:53 GMT
Organization: AND Software BV
Hi,
According to the Q/A in Develop 16 (page 130)...
"Since FlattenMovieData" will simply append to a data fork of
a file, you can pass it any data file and it will append the
movie data to that file. Quicktime doesn't care what's stored
before or after the movie data, as long as you don't reposition
the movie data within the data dile."
Well, if I try this, and append a movie using FlattenMovieData",
the first 8 bytes will be overwritten with 4 bytes and then 'mdat'.
Even if I pass the flag 'flattenAddMovieToDataFork' !
It seems like this is a bug! I don't want that data stored before
the movie overwritten. My solution now is to read the first 8
bytes, then FlattenMovieData one or more quicktimes movie files
and then restore the first 8 bytes. But I am not certain that
replacing those 8 bytes won't have any side effects. What I do
is store the "Movie" structure, using PutMovieIntoDataFork at
a specific offset.
My datafile looks like this:
- -------------------------------
| some data (other than movies) |
- -------------------------------
| flattened movie |
- -------------------------------
| "Movie" structure |
- -------------------------------
| flattened movie |
- -------------------------------
| "Movie" structure |
- -------------------------------
| flattened movie |
- -------------------------------
| "Movie" structure |
- -------------------------------
This works. But the first 8 bytes are overwritten in "some data".
Any info would be very much appreciated!
Frank Manshande
frankm@and.nl
+++++++++++++++++++++++++++
>From ivanski@world.std.com (Ivan M CaveroBelaunde)
Date: Mon, 13 Jun 1994 18:05:25 GMT
Organization: The World Public Access UNIX, Brookline, MA
Frank Manshande <frankm@and.nl> writes:
>This works. But the first 8 bytes are overwritten in "some data".
What happens is that QT stores the info in a Bento-like atomic form. The
single-fork movie (flattened means "self-contained", not "single-fork").
must contain "atoms" in order for QT to properly navigate it. Atoms are
structured as follows:
{
long atomSize; // includes atomSize+atomType
OSType atomType;
... atom specific data ...
}
So for your multimovie file to work it needs to contain atom headers
before each movie data atom of the right size. It also needs an
atom header in front of your data to allow QT to traverse the movie.
This isn't a bug AFAIK; it seems Develop 16 was wrong in the general
case (you can't just append the movie data for single fork files). If
you control the file format, however, and you can add the atom header
yourself, then it is feasible to do what they say. Given this structure,
however, I'd avoid "restoring" the first 8 bytes as you were doing,
since it's bound to affect your ability to access the multiple movies...
Additionally, you might want to check out John Wang's article
in Develop 17 ("Somewhere in QuickTime"), since I seem to remember
there is a bug in FlattenMovieData in which the size field is not
properly set when using multiple movies, and a fix (BetterFlattenMovieData)
is discussed in it.
Hope this helps,
-Ivan
- -
Ivan Cavero Belaunde (ivanski@world.std.com)
Avid VideoShop Project Lead
Avid Technology, Inc.
+++++++++++++++++++++++++++
>From Frank Manshande <frankm@and.nl>
Date: Tue, 14 Jun 1994 06:51:11 GMT
Organization: AND Software BV
In article <CrCKx2.952@world.std.com> Ivan M CaveroBelaunde,
ivanski@world.std.com writes:
>If you control the file format, however, and you can add the atom header
>yourself, then it is feasible to do what they say. Given this structure,
>however, I'd avoid "restoring" the first 8 bytes as you were doing,
>since it's bound to affect your ability to access the multiple movies...
Well,
First of all thanks for your time!
I have written two small programs. One that adds a movie to ANY kind
of file, and displays the offset of the 'movie resource' using the
PutMovieIntoDataFork call. And another program that can play the movies
at the specified offsets. This does seem to work correctly.
The only side-effect I have encountered so far is that the file which
I added the movies to cannot be played by SimplePlayer. SimplePlayer
can play the first movie if I don't save and restore the first 8 bytes
of the file. But because I don't want to play the movies using a
general movie player, but only from my own program, this should not
be a problem.
The reason I have to restore the first 8 bytes of the file is that
the quicktime movies are added to a specific database file (the database
file is of proprietary format), and the database engine doesn't work
if the first 8 bytes are overwritten.
The reason why I don't just create two seperate files (one with the
database and one with all the quicktime movies) is that our customers
(and our company) only wants ONE file, which contains all the data.
Does anybody know if saving and restoring the first 8 bytes that
FlattenMovieData overwrites has any other side effects then not
allowing programs such as SimplePlayer to play a movie?
Thanks!
Frank Manshande
frankm@and.nl
+++++++++++++++++++++++++++
>From Peter Vanags <peterv@uclink.berkeley.edu>
Date: 15 Jun 1994 20:43:47 GMT
Organization: UCB
In article <CrDKDC.30H@and.nl> Frank Manshande, frankm@and.nl writes:
>Does anybody know if saving and restoring the first 8 bytes that
>FlattenMovieData overwrites has any other side effects then not
>allowing programs such as SimplePlayer to play a movie?
Nope, not a problem. The only caveat is you MUST use
NewMoveFromDataFork() with the offset to the 'mdat' or 'moov' atom to
retrieve the movie, if the other data in the data fork is not stored in
"atom" form.
To be clean about using FlattenMovieData(), you should use the following
procedure:
- store the first 8 bytes of the data fork
- store the file's length
- append a dummy 'mdat' atom to the end of the data fork
- call FlattenMovieData()
- check the offset to the end of the movie data, which is now
in the first 4 bytes of the data fork, compare to the length
before FlattenMovieData() was called
and update your dummy atom
- restore the first 8 bytes of the file's data fork
I talked with John Wang at MacDTS (author of the "Somewhere in QuickTime"
column in develop) quite a bit about this issue right before he published
the article.
Peter Vanags
peterv@uclink.berkeley.edu
+++++++++++++++++++++++++++
>From jywang@apple.com (John Wang)
Date: 16 Jun 1994 00:27:12 GMT
Organization: Apple Computer, Inc.
FYI. The bug fix for the problem described in issue #17 of my article has
been added to QuickTime 2.0. If you use my BetterFlattenMovie or
BetterFlattenMovieData routine, you will be all set since
BetterFlattenMovie only patches FlattenMovie when QuickTime 1.6.X or
earlier is used.
John
---------------------------
>From Jens Alfke <jens_alfke@powertalk.apple.com>
Subject: Here's how to get OpenDoc
Date: Wed, 15 Jun 1994 23:30:31 GMT
Organization: Apple Computer
I just got off the phone with our evangelist, Mark "Rev. Billy-Bob" Thomas,
to get the true facts about OpenDoc seeding. Here's the scoop.
* The current (a6) version of OpenDoc is _not_ going to be distributed more
widely than to the WWDC attendees. They decided against a blanket mailing to
all registered developers because, as Mark put it, "You only get one chance
to make a good first impression". The a6 build is still a bit flaky, requires
MPW, and doesn't come with much in the way of documentation. Their fear was
that, if everybody got it, many would play with it a little, run into
problems, and not look at it again later when things are more polished.
* The beta seed _is_ going to be distributed widely. It'll be on the
developer CD. It'll be on the 'develop' bookmark CD, and we're hoping to get
a number of OpenDoc articles in that issue of 'develop'. (Note that anyone
can order single issues of 'develop' from APDA for $10.) This will probably
be in September given the lead time involved in pressing CDs. By that time
the code will be more stable, you'll be able to build with CodeWarrior (hope
hope hope), and there will be at least draft versions of the official
documentation for both OpenDoc and the framework.
* But! If you're interested in getting started with OpenDoc _now_ (and how
can I blame you?) you can send mail to OpenDoc@applelink.apple.com and get a
CD with version a6 in return for filling out a short form.
* Feel free to post OpenDoc questions here; I'll try to answer them. There is
an OpenDoc mailing list; send mail to <majordomo@cil.org> with body
"subscribe opendoc-interest" to subscribe. There is also a discussion board
on AppleLink somewhere.
I hope this answers your questions. Sorry about any misinformation I've
posted in the past ...
--Jens Alfke
jens_alfke@powertalk Rebel girl, rebel girl,
.apple.com Rebel girl you are the queen of my world
+++++++++++++++++++++++++++
>From chuck@molecule.Physics.Drexel.Edu (Chuck Browne)
Date: Thu, 16 Jun 1994 16:35:00 GMT
Organization: Drexel University
Jens Alfke (jens_alfke@powertalk.apple.com) wrote:
: I just got off the phone with our evangelist, Mark "Rev. Billy-Bob" Thomas,
: to get the true facts about OpenDoc seeding. Here's the scoop.
: * The beta seed _is_ going to be distributed widely. It'll be on the
: developer CD. It'll be on the 'develop' bookmark CD, and we're hoping to get
Thanks, Jens
Is there any problem with lending it to Metrowerks for shipping on the
DR4 CD, which roughly comes out at the same time?
(Not that I'm trying to save a couple of bucks or anything... :-) )
Chuck
+++++++++++++++++++++++++++
>From Jens Alfke <jens_alfke@powertalk.apple.com>
Date: Thu, 16 Jun 1994 22:55:44 GMT
Organization: Apple Computer
Chuck Browne, chuck@molecule.Physics.Drexel.Edu writes:
> Is there any problem with lending it to Metrowerks for shipping on the
> DR4 CD, which roughly comes out at the same time?
I think Mark wants people to go directly to Apple to obtain it. He wants to
keep tabs on how many people have it and who they are (in case we need to
send out any mass mailings, or sell your names and addresses to The Sharper
Image :)
> (Not that I'm trying to save a couple of bucks or anything... :-) )
I don't think we're charging anything for the OpenDoc seed.
--Jens Alfke
jens_alfke@powertalk Rebel girl, rebel girl,
.apple.com Rebel girl you are the queen of my world
+++++++++++++++++++++++++++
>From chuck@molecule.Physics.Drexel.Edu (Chuck Browne)
Date: Fri, 17 Jun 1994 00:58:43 GMT
Organization: Drexel University
Jens Alfke (jens_alfke@powertalk.apple.com) wrote:
: Chuck Browne, chuck@molecule.Physics.Drexel.Edu writes:
: > Is there any problem with lending it to Metrowerks for shipping on the
: > DR4 CD, which roughly comes out at the same time?
: I think Mark wants people to go directly to Apple to obtain it. He wants to
: keep tabs on how many people have it and who they are (in case we need to
: send out any mass mailings, or sell your names and addresses to The Sharper
: Image :)
: > (Not that I'm trying to save a couple of bucks or anything... :-) )
: I don't think we're charging anything for the OpenDoc seed.
I meant the $10 for develop, but what you say is good to hear.
(Not that I need OpenDoc or anything, I'm just curious about it and
what it will mean to software in the next couple of years...
maybe I'll try it out, if I manage to get my PhD on schedule..)
Thanks,
Chuck
: --Jens Alfke
: jens_alfke@powertalk Rebel girl, rebel girl,
: .apple.com Rebel girl you are the queen of my world
---------------------------
>From belanger@bach.ulaval.ca (Yves Belanger)
Subject: How to know the cursor is into a polygon?
Date: Tue, 14 Jun 1994 18:09:32 GMT
Organization: Universite Laval, Ste-Foy (Quebec), Canada
Hello,
I am writing an application where districts are drawn on a geographic
map. Districts are made with many points, like a polygon in MacDraw.
Each point is given a longitude and a latitude. I have functions that
translate back and forth these coordinates into screen coordinates.
My problem is how to determine that a user has clicked inside one of
those polygon or the click was outside them all? If the solution could
work with longitude and latitude, that would be greater, since less
computing would be involved. Thank you.
S. Beaudry
+++++++++++++++++++++++++++
>From Mark Hanrek <hanrek@cts.com>
Date: Tue, 14 Jun 1994 22:49:07 GMT
Organization: The Information Workshop
In article <CrEFrx.LDq@athena.ulaval.ca> Yves Belanger,
belanger@bach.ulaval.ca writes:
> I am writing an application where districts are drawn on a geographic
> map. Districts are made with many points, like a polygon in MacDraw.
> Each point is given a longitude and a latitude. I have functions that
> translate back and forth these coordinates into screen coordinates.
The most common approach is to take advantage of the Macintosh's built-in
region capabilities. They are incredibly powerful, and very easy to use.
You can easily take any polygon and create the equivalent region from it,
which is kept in a RegionHandle.
Keep a list of these RegionHandles handy, one for each district, and when
the user clicks, take the location of the click and then in a loop use
the PtInRgn() toolbox call to test whether that point is within each of
the regions. When the result is true, bingo.
If there are overlapping regions, be sure they are set up and tested in
front to back order.
That's all there is to it, unless I misunderstood your situation.
I forget the exact calls to make a region from a polygon, but the whole
process is exceedingly simple.
This is the only approach I know of, really.
Mark Hanrek
+++++++++++++++++++++++++++
>From jwbaxter@olympus.net (John W. Baxter)
Date: Tue, 14 Jun 1994 21:09:23 -0700
Organization: Internet for the Olympic Peninsula
In article <CrEFrx.LDq@athena.ulaval.ca>, belanger@bach.ulaval.ca (Yves
Belanger) wrote:
> Hello,
>
> I am writing an application where districts are drawn on a geographic
> map. Districts are made with many points, like a polygon in MacDraw.
> Each point is given a longitude and a latitude. I have functions that
> translate back and forth these coordinates into screen coordinates.
>
> My problem is how to determine that a user has clicked inside one of
> those polygon or the click was outside them all? If the solution could
> work with longitude and latitude, that would be greater, since less
> computing would be involved. Thank you.
My approach would be based on creating a QD region which covers the same
"territory" as the polygon, and using the provided PtInRgn call against the
region. Only if that were not "fast enough" would I probe further.
Or...better...switch to QuickDraw GX, where you're likely to be working
with a polygon shape, and you can easily hit-test that (or any other
shape). That may put things a little more into the future than you want,
though.
--
John Baxter Port Ludlow, WA, USA [West shore, Puget Sound]
No hablo Intel.
jwbaxter@pt.olympus.net
+++++++++++++++++++++++++++
>From Jens Alfke <jens_alfke@powertalk.apple.com>
Date: Wed, 15 Jun 1994 22:21:34 GMT
Organization: Apple Computer
In article <CrEFrx.LDq@athena.ulaval.ca> Yves Belanger,
belanger@bach.ulaval.ca writes:
> My problem is how to determine that a user has clicked inside one of
> those polygon or the click was outside them all?
As has been said, the easiest solution is to create a region of the same
shape as the polygon, then call PtInRegion. This does have the drawback that
regions containing diagonal lines eat up lots of memory. (Think of the
boundary of the region as a polygon, including little stairsteps at pixel
edges on diagonal lines. The region then occupies about two to four bytes per
vertex of that polygon.) Unfortunately, regions larger than 64kbytes will
crash QuickDraw. This shouldn't be a problem unless your polygons are very
large or complex.
To create a region from a polygon:
* Call OpenRgn
* MoveTo the first point in the polygon, LineTo each succeeding point. Make
sure to end with a LineTo back to the first point.
* Call CloseRgn.
Your other alternative is to use a real "point in polygon" test. You could
either be the four millionth person this month to ask about this on
comp.graphics.algorithms, or you could get a standard computer graphics
textbook like "Computer Graphics: Principles and Practice" by Foley, Van Dam
et al. There may also be source code available by ftp, but I have no idea
where.
--Jens Alfke
jens_alfke@powertalk Rebel girl, rebel girl,
.apple.com Rebel girl you are the queen of my world
+++++++++++++++++++++++++++
>From mxmora@unix.sri.com (Matt Mora)
Date: 16 Jun 1994 09:28:11 -0700
Organization: SRI International, Menlo Park, CA
In article <1994Jun15.222134.21946@gallant.apple.com> Jens Alfke <jens_alfke@powertalk.apple.com> writes:
>In article <CrEFrx.LDq@athena.ulaval.ca> Yves Belanger,
>belanger@bach.ulaval.ca writes:
>> My problem is how to determine that a user has clicked inside one of
>> those polygon or the click was outside them all?
>
>As has been said, the easiest solution is to create a region of the same
>shape as the polygon, then call PtInRegion. This does have the drawback that
>regions containing diagonal lines eat up lots of memory. (Think of the
>boundary of the region as a polygon, including little stairsteps at pixel
>edges on diagonal lines. The region then occupies about two to four bytes per
>vertex of that polygon.) Unfortunately, regions larger than 64kbytes will
>crash QuickDraw. This shouldn't be a problem unless your polygons are very
>large or complex.
>
>To create a region from a polygon:
>* Call OpenRgn
>* MoveTo the first point in the polygon, LineTo each succeeding point. Make
>sure to end with a LineTo back to the first point.
>* Call CloseRgn.
>
>Your other alternative is to use a real "point in polygon" test. You could
>either be the four millionth person this month to ask about this on
>comp.graphics.algorithms, or you could get a standard computer graphics
>textbook like "Computer Graphics: Principles and Practice" by Foley, Van Dam
>et al. There may also be source code available by ftp, but I have no idea
>where.
>From the UMPG Vol II
Subject: Re: Point in Polygon routine needed
From: fry@zariski.harvard.edu (David Fry)
In article <8fxkxAO00WB7M=nOFO@andrew.cmu.edu> Andrew Lewis Tepper <at15+@andrew.cmu.edu> writes:
>I don't know if this routine is "standard", I just came up with it recently:
>
>For a polygon of points p1...pn, and a point P, make a table as follows:
>
>T(1)= angle from p1 to P to p2
>T(2)= angle from p2 to P to p3
>...
>T(n)= angle from pn to P to p1
>
>express all angles as: -PI < angle < PI.
>
>Add all entries in the table. If the sum = 0, the point is outside. If
>the sum is +/- PI, the point is inside. If the point is +/- xPI, you
>have a strange polygon. If ANY angle was = +/-PI, the point is on the
>border.
>
>Does anyone know if this is considered a good (known?) algorithm? It
>took a long time to come up with!
You have the essence of the "good," standard algorithm, but if you're
working with thousands of polygons, those floating point calculations
will be too slow and will probably lead to round-off error at some
point. Round-off error is a huge pain in computational geometry
problems. The hard part is finding ways to avoid it.
The trick is that you don't need to know the angle between the lines,
you just need to know its sign, called the *circulation*. For every
line AB in the polygon, form the triangle PAB and you want to know
does it lie inside the polygon or not. That is, if you were riding a
bike counterclockwise around the boundary of the polygon, would P
lie on your left or your right when you crossed AB? You can find this
by calculating PA x PB = (A.x-P.x)*(B.y-P.y) - (A.y-P.y)*(B.x-P.x).
The circulation (the sign of PA x PB) can be found without doing a
multiplication in many cases, but this is good enough. Remember,
we've oriented the polygon so that you come to A before coming to B as
your traverse its boundary.
Then the algorithm is:
In = 0
foreach edge AB in the polygon
if A.y < P.y and B.y >= P.y and PA x PB > 0
In = In + 1
if A.y >= P.y and B.y < P.y and PA x PB < 0
In = In - 1
Then if In = 1, P is inside the polygon, and is outside if I = 0.
This doesn't handle the case where P lies on some edge AB of the
polygon.
David Fry fry@math.harvard.edu
Division of Applied Sciences fry@huma1.bitnet
Harvard University ...!harvard!huma1!fry
Cambridge, MA 02138
- ----------
end of artile
Xavier
--
___________________________________________________________
Matthew Xavier Mora Matt_Mora@sri.com
SRI International mxmora@unix.sri.com
333 Ravenswood Ave Menlo Park, CA. 94025
+++++++++++++++++++++++++++
>From Rick Wong <rick@jessica.stanford.edu>
Date: 16 Jun 1994 17:59:54 GMT
Organization: Stanford University
In article <CrEFrx.LDq@athena.ulaval.ca> Yves Belanger,
belanger@bach.ulaval.ca writes:
> My problem is how to determine that a user has clicked inside one of
> those polygon or the click was outside them all?
One approach is to create an offscreen bitmap with its origin set
up so that the bitmap is centered around the click locaction. The
bitmap doesn't have to be very big at all, just enough for your hit
tolerance. For each polygon you want to test, clear the bitmap,
then draw the polygon into it (if you want to see if the point is
inside the polygon, you should draw it with a black fill pattern).
You can then examine the individual bits around the click location
to see if any are set.
Of course, such "cleverness" is unnecessary under QuickDraw GX....
--Rick Wong
---------------------------
>From platypus@cirrus.som.cwru.edu (Gary Kacmarcik)
Subject: PowerPC load-store (was Re: Fast full screen scrolling: impossible?)
Date: 15 Jun 1994 15:23:53 GMT
Organization: Case Western Reserve University, Cleveland, Ohio (USA)
In article <1994Jun12.182803.1@west.cscwc.pima.edu> 103t_english@west.cscwc.pima.edu writes:
> And finally, what happened to the load/store multiple instructions that are
> (I assume?) faster on the 601, but will probably be slower "in future
> implementations?"
the load/store multiple instructions are not faster than a series of loads
and stores (except perhaps if there are stalls from the instruction cache).
they take 1 cycle per load or store.
these instructions are present to make saving and restoring registers
(GPRs only) to the stack a little bit easier. that's really the only benefit
to them.
many of the PowerPC architects do not like these instructions because they
do not fit the RISC model very well, thus they complicate the processor
implementation. don't expect IBM/Motorola to invest much time on these
instructions. witness the lack of equivalent instructions for floating-
point registers or for 64-bit GPRs.
these instructions will become slower when they decide to eliminate them
and handle them via trap-and-emulate. (hey, at least they're telling you
all this up front)
-gary j kacmarcik
platypus@cirrus.som.cwru.edu
+++++++++++++++++++++++++++
>From zstern@adobe.com (Zalman Stern)
Date: Wed, 15 Jun 1994 20:34:44 GMT
Organization: Adobe Systems Incorporated
Gary Kacmarcik writes
> the load/store multiple instructions are not faster than a series of loads
> and stores (except perhaps if there are stalls from the instruction
cache).
> they take 1 cycle per load or store.
Which will happen relatively often on the 601. (For example anytime you save
8 or more registers, its guaranteed to happen.)
> these instructions are present to make saving and restoring registers
> (GPRs only) to the stack a little bit easier. that's really the only
benefit
> to them.
They improve code density somewhat. Given the size of native apps that's a
concern.
> many of the PowerPC architects do not like these instructions because they
> do not fit the RISC model very well, thus they complicate the processor
> implementation. don't expect IBM/Motorola to invest much time on these
> instructions. witness the lack of equivalent instructions for floating-
> point registers or for 64-bit GPRs.
Bottom line: the architecture would be better without load/store multiple.
However since the architects could not reach agreement to remove these
instructions, the implementors should support them. As it stands now, some
implementors will makes these instructions competitive and some won't.
Applications developers will be stuck with a choice which way to go. For
load/store multiple, this doesn't bother me that much. (One might take a
minor speed hit to win on code space most places anyway.) However the manual
says similar things about load/store update instructions vs. using a
load/store and an add instruction. This causes a much bigger performance
tradeoff right in the middle of your inner loops. A PowerPC implementation
where the two instruction sequence is faster than an update form instruction
would be braindead.
--
Zalman Stern zalman@adobe.com (415) 962 3824
Adobe Systems, 1585 Charleston Rd., POB 7900, Mountain View, CA 94039-7900
`Wait a second! This is just an octahedron suspended in blue liquid.' - JT
+++++++++++++++++++++++++++
>From platypus@cirrus.som.cwru.edu (Gary Kacmarcik)
Date: 16 Jun 1994 18:34:53 GMT
Organization: Case Western Reserve University, Cleveland, Ohio (USA)
In article <1994Jun15.203444.3373@adobe.com> zstern@adobe.com (Zalman Stern) writes:
>
> Gary Kacmarcik writes
> > these instructions are present to make saving and restoring registers
> > (GPRs only) to the stack a little bit easier. that's really the only
> > benefit to them.
>
> They improve code density somewhat. Given the size of native apps that's a
> concern.
but they don't affect code density all that much. the recommended way
doing the load/store sequence of instructions is to have a series of
loads (or stores) somewhere in the app or OS like
lwz r13,0(r0)
lwz r14,4(r0)
...
lwz r31,68(r0)
bcctr
(or something like that - i believe that the standard save/restore glue
does a few other things, but i don't have the exact sequence handy).
then a function that wants to save a bunch of registers just calculates
the address of where the first register should be saved and branches to
appropriate lwz instruction. you have to do this anyway for floating-
point and 64-bit reg's, so it's not a big deal.
the end result is that if it's done this way, it won't have a big impact
on code density. performance is basically to same too, since the branches
(both of which are unconditional) are "free" and the glue code may
already be in the i-cache (from previous functions).
-gary j kacmarcik
platypus@cirrus.som.cwru.edu
+++++++++++++++++++++++++++
>From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
Date: Fri, 17 Jun 1994 04:23:38 +1200 (NZST)
Organization: (none)
platypus@cirrus.som.cwru.edu (Gary Kacmarcik) writes:
> many of the PowerPC architects do not like these instructions because they
> do not fit the RISC model very well, thus they complicate the processor
> implementation. don't expect IBM/Motorola to invest much time on these
> instructions. witness the lack of equivalent instructions for floating-
> point registers or for 64-bit GPRs.
>
> these instructions will become slower when they decide to eliminate them
> and handle them via trap-and-emulate. (hey, at least they're telling you
> all this up front)
That won't be too bad -- everyone sees it coming, and coming (fairly) soon,
and if you're saving a number of registers the speed hit won't be *that*
horrible (but horrible enough), and most people don't use it inside of
tight loops, and it's no faster than the alternative anyway.
The really, *really* horrible one will come when the "load with update"
and "store with update" instructions get the trap-and-emulate treatment.
For the non PPC-savvy folk, those instructions get used to implement
the C constructs *++p and *--p (and *p++ and *p-- with a smart optomising
compiler that can transform your code).
They're used a *lot*, they're a big speed win on the 601 (less on the
603 and 604 if you don't mind tying up two units for a load and an addi
in parallel becasue you've got nothing better to do with them), and they
occur in speed-critical inner loops.
-- Bruce
---------------------------
>From efisch@cs.tamu.edu (Eric A Fisch)
Subject: Q: Default button & Return key in Modeless Dialog
Date: 16 Jun 1994 18:56:00 GMT
Organization: Texas A&M Computer Science Department, College Station, TX
I am working with modeless dialogs and am quite pleased with the
results. I am having a problem defining a default button and making
the return (or enter) key activate it. Right now, when the return key
is pressed it is passed into the active editable text field. I do have
the OK button at item number 1, but I am clearly missing something. Any
thoughts?
Thanks,
Eric Fisch
efisch@cs.tamu.edu
+++++++++++++++++++++++++++
>From egurney@vcd.hp.com (Eddy J. Gurney)
Date: Thu, 16 Jun 1994 20:01:29 GMT
Organization: Hewlett-Packard VCD
Eric A Fisch (efisch@cs.tamu.edu) wrote:
>I am working with modeless dialogs and am quite pleased with the
>results. I am having a problem defining a default button and making
>the return (or enter) key activate it. Right now, when the return key
>is pressed it is passed into the active editable text field. I do have
>the OK button at item number 1, but I am clearly missing something. Any
>thoughts?
Yes. After calling IsDialogEvent() from your event loop and determining
that this is an event for an open modeless dialog, you need to
"pre-process" the event before passing it on to DialogSelect() and check
for a "keyDown" or "autoKey" event when theEvent.message & charCodeMask
is equal to the Enter or Return key and process it appropriately... being
sure to NOT pass the event on to DialogSelect() afterwards.
You need to do a similar thing anyway to catch Command-key equivalents,
which DialogSelect() also just "pushes" through to TEKey...
--
Eddy J. Gurney N8FPW Hewlett-Packard Company, Vancouver (USA!) Division
egurney@vcd.hp.com #include <standard-disclaimer.h>
"Failures are divided into two classes-- those who thought and never did,
and those who did and never thought." John Charles Salak
+++++++++++++++++++++++++++
>From dubois@primate.wisc.edu (Paul DuBois)
Date: 16 Jun 1994 15:46:39 -0500
Organization: Castra Parvulorum
>From article <2tq780$3i8@news.tamu.edu>, by efisch@cs.tamu.edu (Eric A Fisch):
> I am working with modeless dialogs and am quite pleased with the
> results. I am having a problem defining a default button and making
> the return (or enter) key activate it. Right now, when the return key
> is pressed it is passed into the active editable text field. I do have
> the OK button at item number 1, but I am clearly missing something. Any
> thoughts?
You have to handle it yourself in a modeless dialog.
--
Paul DuBois
dubois@primate.wisc.edu
---------------------------
>From apabla@hercules.cs.uregina.ca (jaime apablaza)
Subject: Questions about Tmon?
Date: Wed, 01 Jun 1994 03:19:37 GMT
Organization: University of Regina
How much does Tmon Pro cost and where can I order it from? I read in the
faq that Tmon has a rather steep learning curve so I was wondering is
that because the manual is rather cryptic. If so are there third party
books on using Tmon? Email preferred.
+++++++++++++++++++++++++++
>From hall_j@sat.mot.com (Joseph Hall)
Date: Wed, 1 Jun 1994 05:42:03 GMT
Organization: Motorola Inc., Satellite Communications
Seems it was apabla@hercules.cs.uregina.ca (jaime apablaza) who said:
>How much does Tmon Pro cost and where can I order it from? I read in the
>faq that Tmon has a rather steep learning curve so I was wondering is
>that because the manual is rather cryptic. If so are there third party
>books on using Tmon? Email preferred.
I'm not aware of any books on TMON (other than the fairly good documentation
that comes with it), but at least TMON seems to have a future now. For a
while it looked as if it had been dropped on the floor and left for dead.
The current trend is STRONGLY toward Jasik's The Debugger, though.
Obviously there is no TMON for PowerPC at this time.
--
Joseph Nathan Hall | Joseph's Law of Interface Design: Never give your users
Software Architect | a choice between the easy way and the right way.
Gorca Systems Inc. | joseph@joebloe.maple-shade.nj.us (home)
(on assignment) | (602) 732-2549 (work) Joseph_Hall-SC052C@email.mot.com
+++++++++++++++++++++++++++
>From chewy@shell.portal.com (Paul F. Snively)
Date: 1 Jun 1994 14:26:07 GMT
Organization: tumbolia.com
In article <1994Jun01.031937.138522@sue.cc.uregina.ca>
apabla@hercules.cs.uregina.ca (jaime apablaza) writes:
> How much does Tmon Pro cost and where can I order it from? I read in the
> faq that Tmon has a rather steep learning curve so I was wondering is
> that because the manual is rather cryptic. If so are there third party
> books on using Tmon? Email preferred.
I would mail, but others might want to read this, too...
TMON Pro does have a significant learning curve, as does probably any
reasonably capable object-level debugger on the Mac. The Mac is a
complex beast itself; to create a debugger that can interact with
heaps, resources, code, registers, etc. is difficult (says a guy who
used to work at ICOM Simulations, Inc.)
Having said that, here are my brief pointers for happiness in TMON Pro:
1) Whenever you have a TMON Pro window open, note the little square box
in
the upper right corner. It looks like a zoom box, and in a sense,
it is:
it will expand the window to show a variety of hidden (ugh) options
for
use in that window.
2) Learn--and I mean _really_ learn--TMON Pro's expression syntax.
Easily
90% of the cool things that you can do with TMON involve non-trivial
use
of expressions. For example, TMON Pro's "Stack Crawl" window is
just a
Memory window with a moderately hairy expression used to crawl up
the
stack. There's an even hairier expression used to create a Memory
window
that gives the names of all of the windows in the current world
(hairy to
do because the titleHandle is at different offsets in b&w vs. color
windows). In particular, make sure that you fully understand
delayed vs.
immediate evaluation.
3) Remember that TMON Pro does, in fact, have a command line.
Command-space
will open it. You may think, "but I hate command lines!" So do I,
but
it's the only way to do certain things in TMON Pro, e.g. type:
"Step 4*LongPointer != F*LongPointer" (that is, step until the value
at
LongPointer changes).
Like many old-hand TMON/TMON Pro users, I'm delighted to know that TMON
Pro for the PowerMac is forthcoming.
- ---------------------------------------------------------------------
Paul F. Snively "Just because you're paranoid, it doesn't mean
chewy@shell.portal.com that there's no one out to get you."
+++++++++++++++++++++++++++
>From dshayer@netcom.com (David Shayer)
Date: Wed, 1 Jun 1994 18:21:37 GMT
Organization: NETCOM On-line Communication Services (408 261-4700 guest)
: > How much does Tmon Pro cost and where can I order it from? I read in the
: > faq that Tmon has a rather steep learning curve so I was wondering is
: > that because the manual is rather cryptic. If so are there third party
: > books on using Tmon? Email preferred.
TMON is a great low level debugger, I don't think its any harder to use
than Macsbug, and it can certainly be easier to learn than Jasik.
It comes with 2 manuals, a reference manual and a tutorial. I simply
read the tutorial all the way thru, and did all the examples. It took
about a week of working every evening. At the end, I was a TMON master.
(Well ok, I'm pretty competent with TMON :-)
There are no books I know of that explain how to use TMON. However,
like all low level debuggers, if you don't know what's going on in
the Mac's guts, you won't know what you're looking at. I highly
recommend Scott Knaster's book, How to Write Mac Software. It actually
does have some examples in TMON, but in TMON 2.8, which is very old.
TMON 3.0 is available from APDA (800-282-2732) for $250.
It suppoessedly has a few quirks on the PowerPC. Its been bought
by a new company, which is doing a PPC upgrade, so hopefully we'll
see a new version of TMON soon.
+------------------------------------------------------------------------+
|David Shayer (415) 595-2523 |
|Sentient Software / Symantec shayer@applelink.apple.com|
|"They're not the best at what they do, Applelink: SHAYER |
| but they're the only ones who do what they do." |
+------------------------------------------------------------------------+
+++++++++++++++++++++++++++
>From roberts@insoftware.com (Robert Schwalbe)
Date: Sat, 11 Jun 1994 09:53:24 -0800
Organization: IN SOFTWARE
In article <dshayerCqqDo2.G1y@netcom.com>, dshayer@netcom.com (David
Shayer) wrote:
> TMON 3.0 is available from APDA (800-282-2732) for $250.
> It suppoessedly has a few quirks on the PowerPC. Its been bought
> by a new company, which is doing a PPC upgrade, so hopefully we'll
> see a new version of TMON soon.
What is the name of this 'new' company, and how would we get in
contact with them?
======================================================================
Robert Schwalbe INET: roberts@insoftware.com
IN SOFTWARE Voice: 619.743.7502
2403 Conway Drive Fax: 619.743.7503
Escondido, CA 92026
+++++++++++++++++++++++++++
>From dshayer@netcom.com (David Shayer)
Date: Wed, 15 Jun 1994 05:03:14 GMT
Organization: NETCOM On-line Communication Services (408 261-4700 guest)
Robert Schwalbe (roberts@insoftware.com) wrote:
: In article <dshayerCqqDo2.G1y@netcom.com>, dshayer@netcom.com (David
: Shayer) wrote:
: > TMON 3.0 is available from APDA (800-282-2732) for $250.
: > It suppoessedly has a few quirks on the PowerPC. Its been bought
: > by a new company, which is doing a PPC upgrade, so hopefully we'll
: > see a new version of TMON soon.
: What is the name of this 'new' company, and how would we get in
: contact with them?
The new "company" is really one guy, named Allan Foster. You
can reach him at afcguru@aol.com.
David
---------------------------
>From cconstan@epdiv1.env.gov.bc.ca (Carl B. Constantine)
Subject: Saving PICT files - Here's CODE!!
Date: Thu, 16 Jun 1994 07:10:55 -0700
Organization: Ministry of Environment, Lands & Parks
Here is some code that works for saving PICT files. This code was
developed by a friend of mine, I'm not the author.
Here you go.
OK, I have working code for writing a PICT file from a mac Picture.
The trick is to write the fields of the Picture in the proper order.
Write 512 zeros, for conformity with old PICT files & MacDraw.
Then write the picture size, the picture rect, and finally the picture
opcodes.
PicHandle macPicture;
static Point SFPwhere = { 150, 150 };
static SFReply reply;
void MakePICTFile ()
{
OSErr iErr;
int iFileRef;
CQDProcs myProcs;
int longZero, i;
long longCount = 1;
Rect pFrame;
PicHandle newPICTHand;
short globalRef;
Rect temp;
int tempSize;
SFPutFile ( SFPwhere, "\pSave PICT Plot as:","\pSaved PICT
Plot",NULL,&reply);
if (reply.good)
{
PleaseWait (); /* change to watch cursor */
ExerciseOffScreen (); /* draw pict in off-screen bitmap */
iErr = Create ( reply.fName, reply.vRefNum, 'MKGW', 'PICT' );
/* create file */
if (iErr != 0)
{
puts("Error - could not create file\n");
return;
}
iErr = FSOpen ( reply.fName, reply.vRefNum, &globalRef );
/* open file */
for ( i = 1; i<= 512; i++) /* write 512 zeros for conformity to
standard */
FSWrite (globalRef, &longCount, 0);
longCount = 2; /* write picture size */
tempSize = (*macPicture)->picSize;
FSWrite (globalRef, &longCount, &tempSize);
longCount = 8; /* write picture rect */
temp = (*macPicture)->picFrame;
FSWrite (globalRef, &longCount, &temp);
/* write picture */
longCount = GetHandleSize ((Handle) macPicture);
FSWrite (globalRef, &longCount, (Ptr) (*macPicture)+10);
/* picture starts 10 bytes from beginning address */
FSClose (globalRef);
}
}
Good luck!
--
=========================================================================
Carl B. Constantine B.C. Environment, Lands & Parks
End-User Support Analyst CCONSTAN@epdiv1.env.gov.bc.ca
PGP Key available if you finger: CCONSTAN@EUSACBC.env.gov.bc.ca
---------------------------
>From nhodulik@hypnos.norden1.com (Nick Hodulik)
Subject: Scroll Bars in DLOG?
Date: 6 Jun 1994 03:52:22 GMT
Organization: Norden 1 Communications
How does one make scroll bars work in a DLOG resource? I know it has something
to do with the CNTL resource, but I can't figure it out. Please help me!
Nick
--
*-----------------------*------------------------------------*---------------*
|nhodulik@norden1.com | "This train | *------* |
|Norden1 Communications | is bound | \ GO / |
|Nick Hodulik | for glory..." | TITANS! |
|Toledo, OH | -Indigo Girls | \/ | \/ |
*-----------------------*------------------------------------*---------------*
+++++++++++++++++++++++++++
>From Alex Kac <akac@delphi.com>
Date: Sat, 18 Jun 94 12:57:50 -0500
Organization: Delphi (info@delphi.com email, 800-695-4005 voice)
Nick Hodulik <nhodulik@hypnos.norden1.com> writes:
>How does one make scroll bars work in a DLOG resource? I know it has something
>to do with the CNTL resource, but I can't figure it out. Please help me!
>
>Nick
Ok...here is some ol PASCAL source for you (easier to read)
FUNCTION NewDlogFilter (theDialog: DialogPtr;
VAR theEvent: EventRecord;
VAR itemhit: integer): boolean;
first, you need to use a ModalDialogFilter (if you're using a modaldialog)
BEGIN
setport(theDialog);
IF (theEvent.what = update) AND (WindowPtr(theevent.message) <> theDialog) &
(WindowPeek(WindowPtr(theEvent.message))^.windowkind = dlog) THEN
UpdtDialog(theDialog, (WindowPeek(WindowPtr(theEvent.message))^.updateRGN))
ELSE IF (theEvent.what = activate) AND (DialogPtr(theEvent.message) <>
theDialog) THEN
{Deactivate any window behind....}
ELSE
CASE theEvent.what OF
...do key stuff here....
M_Down:
BEGIN
hitPt := theEVENT.where;
GlobalToLocal(hitPt);
Ahit := FindControl(hitPt, theDialog, hitControl);
IF NOT (hitControl = NIL) THEN
BEGIN
dhit := FindDitem(theDialog, hitpt) + 1;
GetDitem(theDialog, dhit, itemtype, itemhandle, itemrect);
{here I could have put a contrlAction in each of the 3 controls before I
started the Dialog, but thought this was the best way}
CASE Ahit OF
inButton:
BEGIN
CASE itemtype OF
4..6:
Ahit := TrackControl(hitControl, hitpt, NIL);
7:
Ahit := TrackControl(hitCOntrol, hitpt, Pointer(-1)); {since this is a
button, it can only be a PopUpMenu...}
OTHERWISE
;
END;
CASE dhit OF
...buttons and other stuff here....
inUpButton:
IF NOT (TrackControl(hitControl, hitpt, @UpButtonProc) = 0) THEN
BEGIN
NewDlogFilter := true;
itemhit := dhit;
END;
inDownButton:
IF NOT (TrackControl(hitControl, hitpt, @DownButtonProc) = 0) THEN
BEGIN
NewDlogFilter := true;
itemhit := dhit;
END;
inThumb:
IF NOT (TrackControl(hitControl, hitpt, NIL) = 0) THEN
BEGIN
ChangeBut(hitcontrol, theDialog);
NewDlogFilter := true;
itemhit := dhit;
END;
OTHERWISE
;
END;
END;
END; {end of MDown}
By!
---------------------------
>From mburch@ksu.ksu.edu (Matt Burch)
Subject: Why should't you move baseAddrs?
Date: 15 Jun 1994 18:19:52 -0500
Organization: Kansas State University
Forgive me for sounding obtuse, but what excactly is wrong with
moving around baseAddrs? What's to prevent you from creating, say,
a GWorld or other offscreen pixmap with the same dimensions and
depth as the screen, and then setting the screen's baseAddr to
the baseAddr of the buffer when you want to draw a frame, instead
of blasting it into video memory? Am I missing something here?
Probably.
- Matt Burch
+++++++++++++++++++++++++++
>From kbell@cs.utexas.edu (Kevin Bell)
Date: Wed, 15 Jun 1994 23:30:38 -0600
Organization: The University of Texas at Austin, Austin, Texas
In article <2to2ao$o4k@matt.ksu.ksu.edu>, mburch@ksu.ksu.edu (Matt Burch)
wrote:
> Forgive me for sounding obtuse, but what excactly is wrong with
> moving around baseAddrs? What's to prevent you from creating, say,
> a GWorld or other offscreen pixmap with the same dimensions and
> depth as the screen, and then setting the screen's baseAddr to
> the baseAddr of the buffer when you want to draw a frame, instead
> of blasting it into video memory? Am I missing something here?
> Probably.
>
> - Matt Burch
The reason is that PixMaps are a QuickDraw software data structure, which
has little relation to the underlying video hardware. So if you change the
screen's baseAddr, QuickDraw commands will draw to the new port (if it
doesn't crash, I've never tried this), but the video hardware will continue
to fetch screen data from the old address.
--
Kevin Bell
kbell@cs.utexas.edu
---------------------------
>From valentin+@pitt.edu (Shawn V. Hernan)
Subject: cntl-opt-esc
Date: 14 Jun 1994 00:19:12 GMT
Organization: The University of Pittsburgh
Greetings all,
Once again, I turn to the wisdom of the net...
Is there any way to programatically intercept the cnt-alt-esc
keysequence? You know, the one that asks you if you really want to
force such and such to quit. I thought this was an AppleEvent, but
apparantly not....
Is this a FAQ? Do I have to resort to testing for that in my keyDown
events?
Any help is deeply appreciated,
Thanks,
Shawn
Shawn Valentine Hernan |Is the War on Drugs worth it?
The University of Pittsburgh |Why does the government want your guns?
valentin+@pitt.edu |Does RICO ring a bell?
412-624-6425 |Did you vote in the last election?
+++++++++++++++++++++++++++
>From Steve Maller <maller@genmagic.com>
Date: 14 Jun 1994 19:39:26 GMT
Organization: General Magic
In article <2tit20$59e@usenet.srv.cis.pitt.edu> Shawn V. Hernan,
valentin+@pitt.edu writes:
> Is there any way to programatically intercept the cnt-alt-esc
>keysequence? You know, the one that asks you if you really want to
>force such and such to quit. I thought this was an AppleEvent, but
>apparantly not....
>
>Is this a FAQ? Do I have to resort to testing for that in my keyDown
>events?
No dice. It's a pretty low level system patch (to PostEvent, I think)
so you'd have to patch PostEvent yourself and filter it out.
- ---------------------------------------------------------------
Steve Maller
Husband & Father
General Magic, Inc.
+++++++++++++++++++++++++++
>From mxmora@unix.sri.com (Matt Mora)
Date: 14 Jun 1994 15:33:11 -0700
Organization: SRI International, Menlo Park, CA
In article <2tl11e$lu0@gatekeep.genmagic.com> Steve Maller <maller@genmagic.com> writes:
>In article <2tit20$59e@usenet.srv.cis.pitt.edu> Shawn V. Hernan,
>valentin+@pitt.edu writes:
>> Is there any way to programatically intercept the cnt-alt-esc
>>keysequence? You know, the one that asks you if you really want to
>>force such and such to quit. I thought this was an AppleEvent, but
>>apparantly not....
>>
>>Is this a FAQ? Do I have to resort to testing for that in my keyDown
>>events?
Here you go from the up and coming UMPG volume II.
(yes I'm actually working on it)
Subject: No Option Escape code
From: Manuel Veloso <veloso@husc9.harvard.edu>
Distribution: world
Someone a while back wanted code for killing off Force-Quit. Well, here's
one I found on CIS (I think) a few weeks ago. It works(!). It's in MPW
assembly, but 95% of it is the generic init install/patch. For anyone
doing
standalone systems (kiosks), well, you know...
; NoEscape.a
include 'Traps.a'
machine mc68000
case obj
INITEntry proc export
lea EndPatch,a0
lea StartPatch,a1
sub.l a1,a0
move.l a0,d0
move.l a0,d3
_NewPtr sys
move.l a0,d4
beq.s NoPatch
move.l a0,a1
lea StartPatch,a0
move.l d3,d0
_BlockMove
move.w #$a9c9,d0
_GetTrapAddress newTool
lea RealSysError,a1
move.l a0,(a1)
move.w #$a9c9,d0
move.l d4,a0
_SetTrapAddress newTool
NoPatch
rts
StartPatch cmpi.w #$4e22,d0
beq.s NoThanks
move.l RealSysError,-(sp)
NoThanks
rts
RealSysError ds.l 1
EndPatch equ *
endp
end
--
___________________________________________________________
Matthew Xavier Mora Matt_Mora@sri.com
SRI International mxmora@unix.sri.com
333 Ravenswood Ave Menlo Park, CA. 94025
+++++++++++++++++++++++++++
>From Greg_Marriott@genmagic.com (Greg Marriott)
Date: Wed, 15 Jun 1994 06:21:07 -0800
Organization: General Magic, Inc.
Steve Maller <maller@genmagic.com> wrote:
> valentin+@pitt.edu writes:
> > Is there any way to programatically intercept the cnt-alt-esc
> >keysequence?>
> No dice. It's a pretty low level system patch (to PostEvent, I think)
> so you'd have to patch PostEvent yourself and filter it out.
Or you could patch SysError and intercept the dialog just before it comes
up, pretending the user hit cancel.
--
Greg Marriott
Just Some Guy
General Magic, Inc.
Disclaimer: My opinions are not necessarily the same as General Magic's.
(can a company even HAVE an opinion?)
+++++++++++++++++++++++++++
>From Dave Falkenburg <falken@apple.com>
Date: Wed, 15 Jun 1994 16:14:42 GMT
Organization: Apple Computer, Inc.
In article <Greg_Marriott-150694062108@internet-macip-45.genmagic.com>
Greg Marriott, Greg_Marriott@genmagic.com writes:
>Steve Maller <maller@genmagic.com> wrote:
>> valentin+@pitt.edu writes:
>> > Is there any way to programatically intercept the cnt-alt-esc
>> >keysequence?>
>> No dice. It's a pretty low level system patch (to PostEvent, I think)
>> so you'd have to patch PostEvent yourself and filter it out.
>
>Or you could patch SysError and intercept the dialog just before it comes
>up, pretending the user hit cancel.
SysError(20002) is how force-quit happens.
As Greg said, just patch it to just RTS when the error code is 20002,
otherwise call through.
-Dave Falkenburg
-Apple Computer, Inc.
---------------------------
>From fadushin@top.cis.syr.edu (Fred Dushin)
Subject: scroll bars in modal dialogs
Date: Thu, 16 Jun 1994 15:44:22 GMT
Organization: Syracuse University, CIS Dept.
>From what I gather from Inside Mac (old volume I and
Toolbox Essentials), I need to handle mouseDown events
in scroll bars in modal dialogs with a filter proc. I.e.,
ModalDialog does not return the part code for the control,
just the controlID.
Is that so? If so, does someone have a sample filter procedure
that handles scroll bars I can scavange from? Braaa.
Fred Dushin
Syracuse, NY
+++++++++++++++++++++++++++
>From Here@There (Someone)
Date: 17 Jun 1994 16:47:46 GMT
Organization: Large Fuzzy Room
In article <1994Jun16.154422.1710@newstand.syr.edu>,
fadushin@top.cis.syr.edu (Fred Dushin) wrote:
> Is that so? If so, does someone have a sample filter procedure
> that handles scroll bars I can scavange from? Braaa.
DialogBits 2.0.1 does this, it's on the DevCD and the ftp site. Here's the
relevant code from the filter proc that tracks the scroll
control.............
// cut and paste into MPW to view right
// inside your filter proc
GetDItem(inputDialog, kScrollControlItem, &tempItem, &tempHandle,
&tempRect);
if (PtInRect(mousePoint, &tempRect)) {
/* We're in the scroll bar. */
/* Now, what does that mean???? */
/* Well, the Dialog Manager will automatically call FindControl and
TrackControl */
/* and set the control value (in the case of scroll thumbs) */
/* on controls added to your dialog, and in many cases that's all you're
going */
/* to need. */
/* But, ModalDialog does NOT pass back a part code, so if the userPerson
*/
/* clicked on the thumb or arrows of the scroll bar, you won't know,
you'll */
/* just know that the scroll bar was clicked in.*/
/* That's not enough, so we'll to an initial check to see where the
control */
/* was hit */
thePart = FindControl(mousePoint, inputDialog, &returnedControl);
/* if the hit was in an arrow or page area, we'll handle it ourselfs */
if (thePart != inThumb) {
TrackControl(returnedControl, mousePoint, (ProcPtr)DoScrollArrows);
returnVal = true;
}
/* if it was in the thumb, we'll just fall through and let the Dialog
Manager */
/* handle it for us */
}
/* This little routine adjusts the scroll bar during TrackControl */
pascal void DoScrollArrows(ControlHandle theControl, short thePart)
{
short currentVal = GetCtlValue(theControl);
short offSet = 0;
switch (thePart) {
case inUpButton:
offSet = -1;
break;
case inDownButton:
offSet = 1;
break;
case inPageUp:
offSet = -3;
break;
case inPageDown:
offSet = 3;
break;
}
/* set the control value to the new one, as long as it doesn't pass
limits */
currentVal += offSet;
if (currentVal < 1)
currentVal = 1;
if (currentVal > 10)
currentVal = 10;
SetCtlValue(theControl, currentVal);
} /* end DoScrollArrows */
<TR>
Somewhere, sometime
SPA FON
---------------------------
End of C.S.M.P. Digest
**********************